/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.javafx.tools; import com.sun.javafx.collections.ImmutableObservableList; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.control.Button; import javafx.scene.control.ListView; import javafx.scene.control.ScrollPane; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.TitledPane; import javafx.scene.control.cell.PropertyValueFactory; import org.diirt.util.array.ListNumber; import org.diirt.vtype.Display; import org.diirt.vtype.VTable; import org.diirt.vtype.VTypeToString; import org.diirt.vtype.ValueUtil; public final class ValueViewer extends ScrollPane { @FXML private TitledPane commonMetadata; @FXML private TextField typeField; @FXML private TextField alarmField; @FXML private TextField timeField; @FXML private TitledPane numberMetadata; @FXML private TextField displayRangeField; @FXML private TextField alarmRangeField; @FXML private TextField warningRangeField; @FXML private TextField controlRangeField; @FXML private TextField unitField; @FXML private TitledPane enumMetadata; @FXML private TitledPane tableMetadata; @FXML private TableView<VTableColumn> columnsTable; @FXML private TableColumn<VTableColumn, String> columnNameColumn; @FXML private TableColumn<VTableColumn, String> columnTypeColumn; @FXML private TableColumn<VTableColumn, Number> columnSizeColumn; @FXML private ListView<String> labelsField; @FXML private Button inspectTableButton; public ValueViewer() { FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/fxml/ValueViewer.fxml")); fxmlLoader.setRoot(this); fxmlLoader.setController(this); try { fxmlLoader.load(); } catch (IOException exception) { throw new RuntimeException(exception); } columnNameColumn.setCellValueFactory(new PropertyValueFactory<>("name")); columnTypeColumn.setCellValueFactory(new PropertyValueFactory<>("type")); columnSizeColumn.setCellValueFactory(new PropertyValueFactory<>("size")); setValue(null, false); } private Object value; public void setValue(Object value, boolean connection) { commonMetadata(value, connection); numberDisplay(ValueUtil.displayOf(value)); enumMetadata(value); tableMetadata(value); this.value = value; } private void commonMetadata(Object value, boolean connection) { if (value == null) { typeField.setText(null); alarmField.setText(null); timeField.setText(null); } else { Class<?> clazz = ValueUtil.typeOf(value); if (clazz == null) { typeField.setText(null); } else { typeField.setText(clazz.getSimpleName()); } alarmField.setText(VTypeToString.alarmToString(ValueUtil.alarmOf(value, connection))); timeField.setText(VTypeToString.timeToString(ValueUtil.timeOf(value))); } } private void numberDisplay(Display display) { if (display == null) { numberMetadata.setVisible(false); numberMetadata.setManaged(false); } else { numberMetadata.setVisible(true); numberMetadata.setManaged(true); displayRangeField.setText(display.getLowerDisplayLimit() + " - " + display.getUpperDisplayLimit()); alarmRangeField.setText(display.getLowerAlarmLimit()+ " - " + display.getUpperAlarmLimit()); warningRangeField.setText(display.getLowerWarningLimit()+ " - " + display.getUpperWarningLimit()); controlRangeField.setText(display.getLowerCtrlLimit()+ " - " + display.getUpperCtrlLimit()); unitField.setText(display.getUnits()); } } private void enumMetadata(Object value) { if (value instanceof org.diirt.vtype.Enum) { enumMetadata.setVisible(true); enumMetadata.setManaged(true); labelsField.setItems(FXCollections.observableList(((org.diirt.vtype.Enum) value).getLabels())); } else { enumMetadata.setVisible(false); enumMetadata.setManaged(false); } } public static class VTableColumn { private final VTable vTable; private final int columnIndex; public VTableColumn(VTable vTable, int columnIndex) { this.vTable = vTable; this.columnIndex = columnIndex; } public String getName() { return vTable.getColumnName(columnIndex); } public String getType() { return vTable.getColumnType(columnIndex).getSimpleName(); } public int getSize() { Object data = vTable.getColumnData(columnIndex); if (data instanceof ListNumber) { return ((ListNumber) data).size(); } else if (data instanceof List) { return ((List) data).size(); } else { return 0; } } } private void tableMetadata(Object value) { if (value instanceof org.diirt.vtype.VTable) { tableMetadata.setVisible(true); tableMetadata.setManaged(true); VTable vTable = (VTable) value; List<VTableColumn> columns = new ArrayList<>(); for (int n = 0; n < vTable.getColumnCount(); n++) { columns.add(new VTableColumn(vTable, n)); } columnsTable.setItems(FXCollections.observableList(columns)); } else { tableMetadata.setVisible(false); tableMetadata.setManaged(false); columnsTable.setItems(new ImmutableObservableList<>()); } } @FXML private void onInspectTable(ActionEvent event) { VTableInspector.instpectValue((VTable) value); } }